package br.com.bacabeleireiros.sysbeleza.dao.impl;

import java.io.Serializable;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import javax.persistence.Query;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Repository;

import br.com.bacabeleireiros.sysbeleza.dao.IAgendaDAO;
import br.com.bacabeleireiros.sysbeleza.dao.IHorarioDAO;
import br.com.bacabeleireiros.sysbeleza.entity.Agenda;
import br.com.bacabeleireiros.util.persistence.impl.GenericDAOImpl;

@Repository
public class AgendaDAOImpl extends GenericDAOImpl<Agenda, Serializable> implements IAgendaDAO, Serializable {

	private static final long serialVersionUID = 1L;
	
	@Autowired
	IHorarioDAO horarioDAO;

	@Override
	public Agenda buscaAgenda(Date dataDoDia, Long idHorario, Long idFuncionario, Long idCliente) {
		SimpleDateFormat dataFormato = new SimpleDateFormat("yyyyMMdd"); 
		String data = dataFormato.format(dataDoDia);
		String SQL = " from Agenda a "
				   + "where a.horario.idHorario = ? "
				   + "  and a.funcionario.idFuncionario = ? "
				   + "  and to_char(a.dataInicio,'yyyymmdd') = ?"
				   + "  and a.cliente.idCliente = ?";
		Query query = em.createQuery(SQL);
		query.setParameter(1, idHorario);
		query.setParameter(2, idFuncionario);
		query.setParameter(3, data);
		query.setParameter(4, idCliente);
		List<Agenda> l = query.getResultList();
		if (l.size() > 0) {
			return (Agenda) l.get(0);
		} else {
			return null;
		}
	}

	@Override
	public Agenda salva(Agenda agenda, Date data) {
		return save(agenda);
	}

	@Override
	public Agenda getById(Long idAgenda) {
		return getById(Agenda.class, idAgenda);
	}

	@Override
	public void excluiAgenda(Agenda agenda) {
		remove(agenda);
	}

	@Override
	public List<Agenda> getAllDia(Date dataDoDia) {
		SimpleDateFormat dataFormato = new SimpleDateFormat("yyyyMMdd"); 
		String data = dataFormato.format(dataDoDia);
		String SQL = " from Agenda a "
				   + "where to_char(a.dataInicio,'yyyymmdd') = ?";
		Query query = em.createQuery(SQL);
		query.setParameter(1, data);
		
		List<Agenda> listaAG = new ArrayList<Agenda>();
		listaAG = query.getResultList();
		
		for (Agenda l : listaAG) {
			l.setIdHoraFinal(getDuracaoServico(l).get(0)); 
		}
		
		return listaAG;
	}

	@Override
	public List<Agenda> getListaAgendaCliente(Long idCliente) {
		if (idCliente == null) {
			idCliente = 0L;
		}
		String SQL = " from Agenda a where a.cliente.idCliente = ? and not exists (from CaixaMovimentoAgenda ca where ca.agenda.idAgenda = a.idAgenda) order by a.cliente.nome, a.dataInicio";
		Query query = em.createQuery(SQL);
		query.setParameter(1, idCliente);
		return query.getResultList();
	}

	@Override
	public  List<Long> getDuracaoServico(Agenda agenda) {
		
//		long tempoAtend = (agenda.getServico().getTempoAtendimentoHora() * 60 * 60 * 1000) + 
//		                  (agenda.getServico().getTempoAtendimentoMinuto() * 60 * 1000);
//		Date data = new Date(agenda.getDataInicio().getTime() + tempoAtend);		
//		
//		
//		String SQL = " select h.idHorario " + 
//				     " from Agenda a, Horario h " +  
//				     " where to_timestamp(?,'dd/mm/yyyy hh24:mi') between a.dataInicio and a.datafinal " +
//				     "   and to_char(hora,'hh24:mi') between to_char(?,'hh24:mi') and to_char(?,'hh:mi') ";		
//				
//		Query query = em.createQuery(SQL);
//		query.setParameter(1, data);
//		query.setParameter(2, agenda.getDataInicio());
//		query.setParameter(3, agenda.getDatafinal());
//		return query.getResultList();	
		
		String SQL = " select h.idHorario " +
		             " from Horario h, Agenda a " +
		             " where TO_CHAR(h.hora,'hh24:mi') >= TO_CHAR(a.datafinal,'hh24:mi') " +
		             " and a.idAgenda = ? " +
		             " order by h.idHorario ";
		Query query = em.createQuery(SQL);		  
		query.setParameter(1,agenda.getIdAgenda());		
		return query.getResultList();
		
//		List<Long> teste = new ArrayList<Long>();
//		teste.add(1L);
//		teste.add(2L);
//		teste.add(3L);
//		teste.add(4L);
//		teste.add(5L);
//		
//		return teste;
	}

}
